package com.mc.mcgoweb.utils.token;

import com.mc.common.base.BaseResponse;
import com.mc.common.base.ResultUtil;
import com.mc.common.exception.RedisException;
import com.mc.common.redis.Impl.RedisCache;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * TOKEN原理，A系统向B系统发起支付请求，跳转到B系统的支付页面直接带用户ID和支付金额
 * 就是页面请求数据可能被黑客拦截包获取参数，比如支付信息等可以修改，原本500的金额，
 * 拦截到包后修改成0.5
 * 思路：跳转到支付页面之前,服务器内部调用B系统生成令牌的接口 B系统会把参数转换成令牌
 * 生成一个令牌之后，再通过令牌去调到B系统,B系统验证令牌（B系统生成令牌一般会存库中能够，等第二次
 * 带令牌过来的时候会去查库一次），解析出来参数：1.如果符合，那么执行接口，如果不符合，报错。
 */
@SpringBootApplication
@Controller
@RequestMapping("/mc")
public class TokenController {
    @Autowired
    private RedisCache redisCache;

    // 先获取参数接口,返回令牌
    // 使用令牌传递参数 (不是前端调用是服务器调用)
    @GetMapping("/getPayToken")
    @ResponseBody
    public String getPayToken(String userId, Long money) throws RedisException {
        // 生成令牌
        String payToken = UUID.randomUUID().toString();
        //过期时间设置十分钟，十分钟没支付，那么重新获取令牌
        redisCache.put(payToken, userId + "-" + money, 10 * 60);
        return payToken;
    }


    @GetMapping("/pay")
    @ResponseBody
    public BaseResponse pay(String payToken) throws RedisException {
        if (StringUtils.isEmpty(payToken)) {
            return ResultUtil.getFailureResultData("token 不能为空!");
        }
        String result = (String) redisCache.get(payToken);
        if (StringUtils.isEmpty(result)) {
            return ResultUtil.getFailureResultData("参数不能为空!");
        }
        // 直接处理操作数据库
        return ResultUtil.getSuccessResultData("支付成功");
    }

}
